<?php
/**
 * S3云存储插件 - 核心包含文件
 * 
 * @package CommonCloudStorage
 * @author xiaogg
 * @version 1.0
 */
// 防止直接访问
if (!defined('ZBP_PATH')) {
    exit('Access denied');
}
// 插件路径定义
define('CommonCloudStorage_PATH', $zbp->path . 'zb_users/plugin/CommonCloudStorage/');
// 注册插件钩子
RegisterPlugin("CommonCloudStorage", "ActivePlugin_CommonCloudStorage");
/**
 * 激活插件时的处理函数
 */
function ActivePlugin_CommonCloudStorage() {
    global $zbp;
    // 添加上传文件后的钩子 - 用于直接替代上传
    Add_Filter_Plugin('Filter_Plugin_Upload_SaveFile', 'CommonCloudStorage_Upload_SaveFile');
    // 添加URL重写钩子 - 用于将本地URL重写为云存储URL
    Add_Filter_Plugin('Filter_Plugin_Upload_Url', 'CommonCloudStorage_Upload_Url');
    // 添加文件上传前的钩子 - 用于修改上传路径
    Add_Filter_Plugin('Filter_Plugin_Upload_Check', 'CommonCloudStorage_Upload_Check');
    // 添加删除文件的钩子
    Add_Filter_Plugin('Filter_Plugin_Admin_FileList_DelFile', 'CommonCloudStorage_Delete_File');
    // 添加管理界面菜单
    Add_Filter_Plugin('Filter_Plugin_Admin_TopMenu', 'CommonCloudStorage_AddMenu');
}
/**
 * 文件上传检查钩子 - 在上传前执行
 */
function CommonCloudStorage_Upload_Check(&$array) {
    global $zbp;
    $config = CommonCloudStorage_GetConfig();
    if (!$config['enable_sync']) {
        return $array;
    }
    // 标记这是云存储上传，后续处理时会用到
    $array['cloud_storage_mode'] = true;
    return $array;
}
/**
 * 文件上传保存钩子 - 完全接管上传流程（类似七牛云插件实现）
 */
function CommonCloudStorage_Upload_SaveFile($tmp, &$upload) {
    global $zbp;
    $config = CommonCloudStorage_GetConfig();
    if (!$config['enable_sync']) {
        return;
    }
    // 创建临时文件路径
    $file_path = $zbp->usersdir . 'upload/zbp.cloudtmp.' . time() . '.' . mt_rand(0, 9999);
    $file_name = date("Ymd", time()) . mt_rand(1000, 9999) . '_' . mt_rand(0, 10000) . '.' . GetFileExt($upload->SourceName);
    // 保存临时文件
    if (is_file($tmp)) {
        @move_uploaded_file($tmp, $file_path);
    } else {
        @file_put_contents($file_path, base64_decode($tmp));
    }
    $upload->Name = $file_name;
    // 构造云存储路径
    $cloud_path = date("Y/m/", time()) . $file_name;
    $upload->Metas->cloud_storage_path = $cloud_path;
    // 上传到云存储
    $uploadResult = CommonCloudStorage_SyncFile($cloud_path, $file_path, $config);
    if ($uploadResult) {
        // 存储云存储路径到Metas中（类似七牛云插件的实现）
        // 如果返回的是URL（字符串），说明上传成功且返回了完整的URL
        if (is_string($uploadResult)) {
            CommonCloudStorage_Log('文件已直接上传到云存储: ' . $uploadResult);
        } else {
            CommonCloudStorage_Log('文件已直接上传到云存储: ' . $cloud_path);
        }
        // 删除临时文件
        unlink($file_path);
        // 完全接管上传流程，阻止后续处理
        $GLOBALS['Filter_Plugin_Upload_SaveFile']['CommonCloudStorage_Upload_SaveFile'] = PLUGIN_EXITSIGNAL_RETURN;
        return true;
    } else {
        CommonCloudStorage_Log('云存储上传失败，保留本地文件: ' . $file_path);
        return false;
    }
}
/**
 * URL重写函数 - 将本地URL重写为云存储URL
 */
function CommonCloudStorage_Upload_Url(&$upload) {
    global $zbp;
    $config = CommonCloudStorage_GetConfig();
    if (!$config['enable_sync']) {
        return;
    }
    // 如果URL已经是云存储URL，不需要重写
    if (strpos($upload->Url, $config['bucket_domain']) !== false) {
        return $upload->Url;
    }
    // 从Metas中获取云存储路径（类似七牛云插件的实现）
    if (isset($upload->Metas->cloud_storage_path) && !empty($upload->Metas->cloud_storage_path)) {
        $cloud_path = $upload->Metas->cloud_storage_path;
    } else {
        // 从本地URL提取相对路径作为后备
        $localUrl = $upload->Url;
        $relativePath = str_replace($zbp->host, '', $localUrl);
        $relativePath = ltrim($relativePath, '/');
        $cloud_path = $relativePath;
    }
    // 获取云存储URL
    $cloudUrl = CommonCloudStorage_GetCloudUrl($cloud_path, $config);
    // 重写URL为云存储地址
    $upload->Url = $cloudUrl;
    return $cloudUrl;
}
/**
 * 删除文件时同步删除云端文件
 */
function CommonCloudStorage_Delete_File(&$array) {
    global $zbp;
    $config = CommonCloudStorage_GetConfig();
    if (!$config['enable_sync']) {
        return $array;
    }
    if (isset($array['file'])) {
        CommonCloudStorage_DeleteFile($array['file'], $config);
    }
    return $array;
}
/**
 * 添加管理菜单
 */
function CommonCloudStorage_AddMenu(&$array) {
    global $zbp;
    $array[] = array(
        'name' => '云存储管理',
        'url' => $zbp->host . 'zb_users/plugin/CommonCloudStorage/main.php',
        'level' => ROLE_ADMIN
    );
    return $array;
}
/**
 * 获取插件配置
 */
function CommonCloudStorage_GetConfig() {
    global $zbp;
    $config = array(
        'enable_sync' => $zbp->Config('CommonCloudStorage')->enable_sync,
        'storage_type' => $zbp->Config('CommonCloudStorage')->storage_type ?: 'AWS',
        'access_key' => $zbp->Config('CommonCloudStorage')->access_key,
        'secret_key' => $zbp->Config('CommonCloudStorage')->secret_key,
        'bucket_name' => $zbp->Config('CommonCloudStorage')->bucket_name,
        'bucket_domain' => $zbp->Config('CommonCloudStorage')->bucket_domain,
        'custom_domain' => $zbp->Config('CommonCloudStorage')->custom_domain,
        'region' => $zbp->Config('CommonCloudStorage')->region ?: 'us-east-1',
        'endpoint' => $zbp->Config('CommonCloudStorage')->endpoint,
        'directory' => $zbp->Config('CommonCloudStorage')->directory ?: ''
    );
    return $config;
}
/**
 * 保存插件配置
 */
function CommonCloudStorage_SaveConfig($config) {
    global $zbp;
    foreach ($config as $key => $value) {
        $zbp->Config('CommonCloudStorage')->$key = $value;
    }
    $zbp->SaveConfig('CommonCloudStorage');
}
/**
 * 同步文件到云存储
 */
function CommonCloudStorage_SyncFile($cloudPath, $localFile, $config) {
    if ($config['storage_type'] === 'FTP') {
        return CommonCloudStorage_FTP_Upload($cloudPath, $localFile, $config);
    } else {
        return CommonCloudStorage_S3_Upload($cloudPath, $localFile, $config);
    }
}
/**
 * 从云存储删除文件
 */
function CommonCloudStorage_DeleteFile($localFile, $config) {
    if ($config['storage_type'] === 'FTP') {
        return CommonCloudStorage_FTP_Delete($localFile, $config);
    } else {
        return CommonCloudStorage_S3_Delete($localFile, $config);
    }
}
/**
 * 获取云存储文件URL - 改进版，支持FTP模式
 */
function CommonCloudStorage_GetCloudUrl($relativePath, $config) {
    $relativePath = ltrim($relativePath, '/');
    
    // 如果有配置目录参数，在域名后拼接目录
    $directory = '';
    if (!empty($config['directory'])) {
        $directory = trim($config['directory'], '/');
        if (!empty($directory)) {
            $directory .= '/';
        }
    }
    
    // FTP模式特殊处理
    if ($config['storage_type'] === 'FTP') {
        // FTP模式优先使用自定义域名
        if (!empty($config['custom_domain'])) {
            $domain = rtrim($config['custom_domain'], '/');
            return $domain . '/' . $directory . $relativePath;
        }
        // 其次使用存储桶域名
        if (!empty($config['bucket_domain'])) {
            $domain = 'https://' . rtrim($config['bucket_domain'], '/');
            return $domain . '/' . $directory . $relativePath;
        }
        // FTP模式如果没有配置域名，返回相对路径（由主程序处理）
        return '/' . $directory . $relativePath;
    } else {
        // S3模式处理逻辑保持不变
        // 优先使用自定义域名
        if (!empty($config['custom_domain'])) {
            $domain = rtrim($config['custom_domain'], '/');
            return $domain . '/' . $directory . $relativePath;
        }
        // 使用存储桶域名
        if (!empty($config['bucket_domain'])) {
            $domain = 'https://' . rtrim($config['bucket_domain'], '/');
            return $domain . '/' . $directory . $relativePath;
        }
        // 如果没有配置域名，使用默认S3端点构建URL
        $endpoint = CommonCloudStorage_GetS3Endpoint($config);
        $bucket = $config['bucket_name'];
        // 构建云存储URL
        if (strpos($endpoint, 'amazonaws.com') !== false) {
            // AWS S3格式: https://bucket.s3.region.amazonaws.com/key
            $region = $config['region'] ?: 'us-east-1';
            return 'https://' . $bucket . '.s3.' . $region . '.amazonaws.com/' . $directory . $relativePath;
        } else {
            // 第三方S3服务格式: https://endpoint/bucket/key
            return rtrim($endpoint, '/') . '/' . $bucket . '/' . $directory . $relativePath;
        }
    }
}
// 加载云存储操作类
require_once CommonCloudStorage_PATH . 'lib/S3Client.php';
require_once CommonCloudStorage_PATH . 'lib/FTPClient.php';
?>